package com.aps.algorithm.heuristic.genetic.model;

import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Author nbZhuozh
 * @Date 2025-09-10  11:06
 *
 * 适应度值计算
 *
 * 职责：
 * 1、定义计算流程
 * 2、辅助业务 缓存数据
 * 3、处理多约束场景，进行多目标优化：加权求和（将多目标 加权变为单目标） Fitness（x） = w1f1(x) + w2f2(x) ..... wnfn(x)
 *
 *
 * [chanllange ！！] 如何高效的分配 仪器设备 和对应的工作时间段 ？
 * [chanllange ！！] 如何高效的处理加班 ？
 *
 *
 * 约束内容:
 * 【设备约束】 ps:影响范围：排期、设备利用率
 *  - 设备类型 （不同类型设备 处理不同工序）
 *  - 设备维护计划 （维护计划的时间内，设备不可用）
 *  - 设备使用时段 （在处理中的设备，时间段内其它工序不可用）
 *  - 设备产能 （不同设备在 处理 同一道工序的时候， 产能不一样）
 *
 *  【工作日、工作时段约束】
 *  - 只能在工作日、工作时段进行排期
 *
 *  【加班约束】
 *  -
 *
 *  【交付期约束】
 *  - 每个染色体的最大结束时间为 实际交期时间（Max(A工序结束时间,B,C,D,....)）
 *  - 交期时间需要结合权重及算加权和
 *
 *  【设备利用率】
 *  -
 *
 *
 **/
public abstract class AbstractCalculateFitness<T extends Gene> {

    public List<Chromosome> chromosomes;

    /**
     * 加载种群
     * @param chromosomes
     */
    AbstractCalculateFitness(List<Chromosome> chromosomes) {
        this.chromosomes = chromosomes;
    }

    /**
     * 初始化染色体
     * @param chromosome
     */
    AbstractCalculateFitness(Chromosome chromosome) {
        this.chromosomes = new ArrayList<>(Collections.singletonList(chromosome));
    }

    protected AbstractCalculateFitness() {}


    public void cal() {
        Assert.notNull(chromosomes, "chromosome must not be null");
        excute(chromosomes);
    }





    /**
     * 计算单个染色体的 适应度函数
     * @param chromosomes
     */
    public abstract void excute(List<Chromosome> chromosomes);




}
